package gcp;

import gcp.enums.ClassificacaoEtaria;
import gcp.enums.ItemEstado;

/**
 * Colecionavel eh uma interface para itens que podem fazer parte da colecao
 * pessoal. Garante que todos os objetos que possam fazer parte da colecao
 * tenham no minimo essas caracteristicas.
 */
public interface Colecionavel {

	/**
	 * Retorna o Ano de publicacao do colecionavel.
	 * 
	 * @return int - O ano de publicacao do colecionavel.
	 */
	public int getAno();

	/**
	 * Retorna os comentarios a respeito do colecionavel quando o mesmo for
	 * adicionado a colecao.
	 * 
	 * @return String - Comenterios a respeito do colecionavel.
	 */
	public String getComentarios();

	/**
	 * Retorna a classsificacao etaria adequada para o colecionavel.
	 * 
	 * @return ClassificacaoEtaria - A classsificacao etaria adequada para o
	 *         colecionavel. Este software considera a Entertainment Software
	 *         Rating Board (ESRB) - a organizacao que analisa, decide e
	 *         determina as classificacoes etarias indicativas para os jogos
	 *         eletronicos comercializados na America do Norte.
	 */
	public ClassificacaoEtaria getClassificacaoEtaria();

	/**
	 * Retorna o estado que o Colecionavel se encontra em relacao a
	 * colecoesDosUsuarios.
	 * 
	 * @return itemEstado - O estado que o Colecionavel se encontra em relacao a
	 *         colecoesDosUsuarios.
	 */
	public ItemEstado getItemEstado();

	/**
	 * Retorna quem publicou o Colecionavel.
	 * 
	 * @return String - Quem publicou o Colecionavel.
	 */
	public String getQuemPublicou();

	/**
	 * Retorna o titulo do colecionavel.
	 * 
	 * @return String - O titulo (nome) do colecionavel.
	 */
	public String getTitulo();

	/**
	 * Atualiza o ano de publicacao do colecionavel para o passado como
	 * parametro.
	 * 
	 * @param ano
	 *            O ano de publicacao do colecionavel a ser atualizado.
	 * @throws Exception
	 *             Lancada quando o ano for negativo.
	 */
	public void setAno(int ano) throws Exception;

	/**
	 * Atualiza os comentarios em relacao ao colecionavel para o passado como
	 * parametro.
	 * 
	 * @param comentarios
	 *            Os cometarios sobre o colecionavel a ser atualizado.
	 * @throws Exception
	 *             Lancada quando o comentario for nulo ou vazio.
	 */
	public void setComentarios(String comentarios) throws Exception;

	/**
	 * Atualiza a classificacao etaria do Colecionavel.
	 * 
	 * @param classificacaoEtaria
	 *            - A classificacao etaria do Colecionavel.
	 */
	public void setClassificacaoEtaria(ClassificacaoEtaria classificacaoEtaria);

	/**
	 * Atualiza o estado do colecionavel em relacao a colecoesDosUsuarios.
	 * 
	 * @param itemEstado
	 *            - O estado do colecionavel em relacao a colecoesDosUsuarios.
	 */
	public void setItemEstado(ItemEstado itemEstado);

	/**
	 * Atualiza o titulo do colecionavel para o passado como parametro.
	 * 
	 * @param titulo
	 *            O titulo do colecionavel a ser atualizado.
	 * @throws Exception
	 *             Lancada quando o titulo for vazio ou nulo.
	 */
	public void setTitulo(String titulo) throws Exception;

	/**
	 * Atualiza quem publicou o colecionavel para o passado como parametro.
	 * 
	 * @param quemPublicou
	 *            Quem publicou o colecionavel.
	 * @throws Exception
	 *             Lancada quando o parametro for nulo ou vazio.
	 */
	public void setQuemPublicou(String quemPublicou) throws Exception;

	/**
	 * Retorna a nota dada ao colecionavel em relacao a sua qualidade.
	 * 
	 * @return int - A nota dada ao colecionavel que vai de 0 a 4.
	 */
	public int getNota();

	/**
	 * Atualiza a nota do colecionavel, em relacao a sua qualidade, para a
	 * passada como parametro.
	 * 
	 * @param nota
	 *            A nota dada ao colecionavel a ser atualizada.
	 * @throws Exception
	 *             Lancada quando a nota passada como parametro for negativa.
	 */
	public void setNota(int nota) throws Exception;
}